// articleModel.js
// 导入 Koa 组件
const Koa = require("koa"); // 官方组件
const range = require("koa-range"); // 官方中间件
const bodyParser = require("koa-bodyparser");
const cors = require("koa2-cors");
const staticFiles = require("koa-static");
const { logger } = require("./middleware"); // 自定中间件
const router = require("./router"); // 路由组件
const path = require("path"); // 路径组件
const { connectDB } = require("./mongodb"); // 连接组件
const config = require("./config.js"); // 配置组件
const cos = require("cos-nodejs-sdk-v5"); // 对象存储

// 创建 Koa 应用
const app = new Koa();

// 设置 Koa 存储
connectDB(); // 连接到数据库

// 设置 Koa 中间件
app
  .use(logger) // 使用日志中间件记录访问日志
  .use(range) // 启用 koa-range 中间件, 提供处理 HTTP 范围请求
  .use(bodyParser({ multipart: true })) // 启用中间件, 允许请求中包含多表单参数(自动处理 JSON 请求)
  .use(
    cors(
      // 启用 koa2-cors 中间件, 允许跨域服务, 允许携带 cookie
      {
        origin: `http://${config.clientIp}:${config.clientPort}`, // 允许的请求域名
        allowMethods: ["GET", "POST", "PUT", "DELETE"], // 允许的请求方法
        credentials: true, // 允许跨域时携带 Cookie(服务端和客户端必须同时设置)
      },
    ),
  )
  .use(router.routes()) // 启用路由中间件, 将定义的路由网络接口添加到 Koa 应用中
  .use(router.allowedMethods()) // 启用路由中间件, 根据请求的 HTTP 方法为响应设置适当的状态码
  .use(staticFiles(path.join(require("swagger-ui-dist").absolutePath()))); // 设置接口文档页面的静态资源

// 设置 Koa 异常捕捉
process.on("uncaughtException", (e) => {
  console.log(e);
});

// 设置 Koa 忽略警告
process.emitWarning = (warning, type, ...args) => {
  if (
    type === "DeprecationWarning" &&
    warning.includes("collection.ensureIndex is deprecated")
  ) {
    return;
  }
};

// 启动 Koa 服务
const ip = config.serverIp; // 从配置中读取 IP
const port = config.serverPort; // 从配置中读取 PORT

app.listen(port, ip, async () => {
  console.log(
    `🎉 The working path for the nfu-town-backend server is ${path.join(__dirname)}`,
  );
  console.log(
    `🎉 The API documentation for nfu-town-backend is available at http://${ip}:${port}/api-docs`,
  );
  console.log(
    `🎉 The nfu-town-backend server is running at http://${ip}:${port}`,
  );
});
